#!/bin/bash
#SBATCH -N 2
#SBATCH -p fat
#SBATCH --ntasks=10
#SBATCH --ntasks-per-node=5
#SBATCH --cpus-per-task=1
#SBATCH --gres=dcu:4
#SBATCH -t 12000:00:00
#SBATCH --men=220G
#就是加载本目录下的env.sh文件内容为环境变量可以修改成module load +路径
source env.sh
#查找python3，一般路径在/usr/bin/python3,/usr/local/bin/python3
which python3

#赋予hostfile变量一个值， 该值来自于$SLURM_JOB_ID的值， $SLURM_JOB_ID的值应在env.sh里面加载为环境变量。
hostfile=./$SLURM_JOB_ID

#将scontrol show hostnames $SLURM_JOB_NODELIST这条命令输出到变量${hostfile} 这个文件里面
#该命令用来追踪任务的信息，输出到${hostfile}所指的这个文件中
scontrol show hostnames $SLURM_JOB_NODELIST > ${hostfile}

#删除当前目录下的hostfile-dl
rm `pwd`/hostfile-dl -f

#for语句
#将变量i的值等于变量$hostfile也就是这条命令（scontrol show hostnames $SLURM_JOB_NODELIST）
for i in `cat $hostfile`
do
#将scontrol show hostnames $SLURM_JOB_NODELISt slots=4 写到当前目录/hostfile-dl-$SLURM_JOB_ID  
#其中 $SLURM_JOB_NODELISt，$SLURM_JOB_ID 应在环境变量中体现（env.sh）
    echo ${i} slots=4 >> `pwd`/hostfile-dl-$SLURM_JOB_ID
#done 结束语
done

#设置变量np为“$(cat $hostfile|sort|uniq |wc -l)输出排序有几行”的值
np=$(cat $hostfile|sort|uniq |wc -l)输出排序有几行

#将np变量输出4次
np=$(($np*4))

#设置变量nodename的值为$hostfile所指文件的第一行，$hostfile在前面被指定
nodename=$(cat $hostfile |sed -n "1p")

#显示nodename这个变量的值
echo $nodename
#获取目标url的值并赋给dist_url这个变量
dist_url=`echo $nodename | awk '{print $1}'`

#for multi-gpu
#在终端上显示下面将要执行的命令
echo mpirun -np $np --allow-run-as-root --hostfile hostfile-dl-$SLURM_JOB_ID  --bind-to none `pwd`/single_template.sh  $dist_url 
#执行命令，
mpirun -np $np --allow-run-as-root --hostfile hostfile-dl-$SLURM_JOB_ID --bind-to none `pwd`/single_template.sh $dist_url #这句话，mpirun 运行  'pwd' 所指的目录下的  .sh文件。


# 以下内容仔细阅读
# mpirun介绍：
#1.   -np 　　　　　要加载的进程个数。（此处的数量由$np的值决定！）
#2.   最简单的运行一个MPI应用程序的例子是： mpirun -np 4 a.out，它将在并行机上加载４个用户执行程序a.out。
#3.   `pwd`/single_template.sh $dist_url 为实际执行的命令。
#4.   single_template.sh 文件需要传参，此处应注意所需的传参数量，传参信息是否正确！！！仔细阅读single_template.sh 文件
#5.   single_template.sh 需要的第一个参数是dist-url，即目标节点的IP地址
#6.   其他两个参数详见 single_template.sh 中的 --batch-size=${3} --a=${2}

#7.  任务执行是否正常的排查逻辑：
#     - 将 echo mpirun -np $np --allow-run-as-root --hostfile hostfile-dl-$SLURM_JOB_ID  --bind-to none `pwd`/single_template.sh  $dist_url 这个一步在控制台打印的信息详细阅读
#     - 可以手动执行这条命令，修改对应参数进行调试
#     - 配合 single_template.sh 脚本，梳理并行任务的调用逻辑。

